Tutoriel HsIndex

Tutoriel HsIndex 6 - Exportation de l'index

L'exportation en chaîne de caractères doit se faire en tenant compte du style. En effet, la structure de donnée IndexStyle contient les éléments intermédiaires à placer entre les différents éléments.

Une fonction principale showIndexSections permet de générer l'index. Le préambule et le postambule sont ajoutés par concaténation à parti des chaînes idxPreamble et idxPostamble.

Exportation des Sections

Pour afficher une section sous forme de chaîne de caractères, on intercale (avec la fonction intercalate) la chaîne qui fait la jonction entre deux sections.

On s'assure de ne prendre que des sections contenant des sous-sections en filtrant avec filter les sous-sections qui ne sont pas vides (not (null sub)).

On appelle avec map et showIndexSection chaque section pour les convertir en chaînes de caractères.

showIndexSections :: IndexStyle     -- ^ The index style.
                  -> [IndexSection] -- ^ The list of section of the index.
                  -> String         -- ^ The output string in the LaTeX format.
showIndexSections style []  = ""
showIndexSections style lst = intercalate (idxGroupSkip0 style) (map (showIndexSection style) lstf)
  where lstf = filter (\(IndexSection tit sub) -> not (null sub)) lst

Une section est affichée de la façon suivante :

  • Le titre.

  • Le suffixe en utilisant idxHeadingSufL0.

  • Les éventuelles sous sections.

Les présences des sections et du titre sont détectés grâce aux empreintes appropriées dans la définition de la fonction ([] et "") :

showIndexSection :: IndexStyle -> IndexSection -> String
showIndexSection style (IndexSection ""  sub) = showIndexSubSections style sub  -- Empreinte avec absence de titre
showIndexSection style (IndexSection tit [] ) = idxHeadingPreL0 style  -- Empreinte avec absence de sous sections
    ++ tit 
    ++ idxHeadingSufL0 style
showIndexSection style (IndexSection tit sub) = idxHeadingPreL0 style 
    ++ tit 
    ++ idxHeadingSufL0 style 
    ++ showIndexSubSections style sub

Exportation des Sous-Sections

L'exportation des sous-sections se fait de la même façon que les sections. Les différences sont que :

  • On utilise les chaînes de caractère associées aux sous-sections.

  • On appelle la fonction permettant de convertir les items en chaînes de caractères.

Exportation des Items

Les entrées d'index sont exportées en affichant :

  • La chaîne de caractère à insérer avant un item.

  • Le nom de l'item.

  • Le délimiteur entre le nom et les numéros de page idxDelim0.

  • Les numéros de pages (en ajoutant la commande LaTeX \hyperpage devant chaque numéro).

  • Les éventuels sous-items.

Exportation des En-Têtes

En-têtes de niveau 1

Pour convertir les en-têtes, là encore on se base sur le style.

Pour savoir dans quel type de section on se trouve, on utilise le pattern matching:

showHeading1 sty (Letters, a) ... 

showHeading1 sty (Numbers, a) ... 

showHeading1 sty (Symbols, a) ... 
  • Si la section en cours concerne des mots (Commençant par des lettres).

    Selon la valeur du style idxHeadingFlag0 on aura:

    • Si idxHeadingFlag0 == UpperCase (Majuscules) alors on prend la première lettre take 1 et on la convertit en majuscule avec toUpper

    • Si idxHeadingFlag0 == LowerCase (Minuscules) alors on prend la première lettre take 1 et on la convertit en majuscule avec toLower

  • Si la section en cours concerne des nombres (Commençant par des chiffres). On utilise le champ idxNumhead qui contient l'en-tête dédié à la section des nombres.

  • Si la section en cours concerne des symboles (Commençant par des symboles). On utilise le champ idxNumhead qui contient l'en-tête dédié à la section des nombres.

showHeading1 sty (Letters, a) | idxHeadingFlag0 sty == UpperCase = map toUpper (take 1 a)
                              | idxHeadingFlag0 sty == LowerCase = map toLower (take 1 a)
                              | otherwise                        = ""

showHeading1 sty (Numbers, a) | idxHeadingFlag0 sty == UpperCase = idxNumhead sty
                              | idxHeadingFlag0 sty == LowerCase = idxNumhead sty
                              | otherwise                        = ""

showHeading1 sty (Symbols, a) | idxHeadingFlag0 sty == UpperCase = idxSymhead sty
                              | idxHeadingFlag0 sty == LowerCase = idxSymhead sty
                              | otherwise                        = ""

En-têtes de niveau 2

Les en-têtes de niveau 2 sont des en-têtes permettant de subdiviser le classement de l'index.

Comme les en-têtes de niveau 1, on affiche le titre en fonction du style.

  • Si la section en cours concerne des mots (Commençant par des lettres).

    Selon la valeur du style idxHeadingFlag1 on aura:

    • Si idxHeadingFlag1 == UpperCase (Majuscules) alors on prend les deux premières lettres take 2 et on les convertit en majuscule avec toUpper

    • Si idxHeadingFlag1 == LowerCase (Minuscules) alors on prend les deux premières lettres take 2 et on les convertit en majuscule avec toLower

  • Si la section en cours concerne des nombres (Commençant par des chiffres) alors on prend le premier caractère take 1.

  • Si la section en cours concerne des symboles (Commençant par des symboles), la aussi on prend le premier caractère take 1.

showHeading2 sty (Letters, a) | idxHeadingFlag1 sty == UpperCase = map toUpper (take 2 a)
                              | idxHeadingFlag1 sty == LowerCase = map toLower (take 2 a)
                              | otherwise                        = ""

showHeading2 sty (Numbers, a) | idxHeadingFlag1 sty == UpperCase = take 1 a
                              | idxHeadingFlag1 sty == LowerCase = take 1 a
                              | otherwise                        = ""

showHeading2 sty (Symbols, a) | idxHeadingFlag1 sty == UpperCase = take 1 a
                              | idxHeadingFlag1 sty == LowerCase = take 1 a
                              | otherwise                        = ""

On peut aussi simplifier les empreintes Numbers et Symbols en modifiant les gardes :

showHeading2 sty (Numbers, a) = if idxHeadingFlag1 sty == None
                                         then ""
                                         else take 1 a

showHeading2 sty (Symbols, a) = if idxHeadingFlag1 sty == None
                                         then ""
                                         else take 1 a